package com.jh.rq;

import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.stream.Stream;

/**
 * @author Li
 * @Date 2023/4/20 15:50
 */
public class StreamDemo3 {
    public static void main(String[] args) {
        /**
         * Stream流的常见中间操作方法:
         * Stream<T> filter​(Predicate predicate)：用于对流中的数据进行过滤
         * Predicate接口中的方法
         * boolean test​(T t)：对给定的参数进行判断，返回一个布尔值
         * Stream<T> limit​(long maxSize)：截取指定参数个数的数据
         * Stream<T> skip​(long n)：跳过指定参数个数的数据
         * static <T> Stream<T> concat​(Stream a, Stream b)：合并a和b两个流为一个流
         * Stream<T> distinct​()：去除流中重复的元素。依赖(hashCode和equals方法)
         *
         * Stream流的常见终结操作方法：
         * void forEach​(Consumer action)：对此流的每个元素执行操作
         * Consumer接口中的方法	void accept​(T t)：对给定的参数执行此操作
         * long count​()：返回此流中的元素数
         */

        ArrayList<String> list = new ArrayList<>();
        list.add("小明");
        list.add("小强");
        list.add("小刚");
        list.add("小刚");

        ArrayList<String> list1 = new ArrayList<>();
        list.add("哈哈");
        list.add("呵呵");
        list.add("嘻嘻");
        list.add("嘻嘻");
//      filter
        Stream<String> stream = list.stream().filter(s -> true); //为true不过滤，false过滤掉元素
        stream.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        System.out.println("--------------");

//        截取指定参数个数的数据
        Stream<String> stream1 = list.stream().limit(2);
        stream1.forEach(s -> System.out.println(s));
        System.out.println("-----------------");

//        跳过指定参数个数的数据
        Stream<String> stream2 = list.stream().skip(1);
        stream2.forEach(s -> System.out.println(s));
        System.out.println("-----------------");

//        合并a和b两个流为一个流
        Stream<String> concat = Stream.concat(list.stream(), list1.stream());
        concat.forEach(s -> System.out.println(s) );
        System.out.println("----------------");

//        去除流中重复的元素
        Stream<String> stream3 = Stream.concat(list.stream(), list1.stream());
        stream3 = stream3.distinct();
        stream3.forEach(s -> System.out.println(s) );


//        Stream流的终结操作方法

//        void forEach​(Consumer action)：对此流的每个元素执行操作
//        list.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });

//        long count​()：返回此流中的元素数
//        System.out.println(list.stream().count());
    }
}
